package fr.jade.util.log;

import java.util.Vector;

import fr.jade.util.JadeException;
import fr.jade.util.log.handler.Handler;
import fr.jade.util.log.handler.TerminalHandler;

/**
 * @author ssicard
 * 
 */
public class Logger {

  static boolean log = true;
  
  static Logger l;
  
  static{
    l = new Logger();
  }
  
  private Vector<Handler> handlers;  

  public Logger() {
    handlers = new Vector<Handler>();

    Handler h1 = new TerminalHandler();
    h1.start();
    //Handler h2 = new FileHandler();
    //h2.start();

    handlers.add(h1);
    //handlers.add(h2);
  }

//  /**
//   * print a trace to the logger
//   * 
//   * @param s
//   */
//  public static void print(String s) {
//    if (log) {
//      System.out.println(s);
//    }
//  }
//
//  /**
//   * print a trace to the logger (with carriage return)
//   * 
//   * @param s
//   */
//  public static void println(String s) {
//    if (log) {
//      System.out.println(s);
//    }
//  }
//
//  /**
//   * print a nested exception in the logger
//   * @param ex the exception to print
//   */
//  public static void print(Exception ex) {
//    if (log) {
//
//      if (ex != null) {
//        System.out.println("Caused by : " + ex.toString() + "(" + ex.getMessage() + ")\n");
//        ex.printStackTrace();
//
//        if (ex instanceof JadeException)
//          print(((JadeException) ex).getNestedException());
//      }
//    }
//  }
//
//  /**
//   * Print a nested exception  (with carriage return).
//   * Print all the nested exception.
//   * 
//   * @param ex
//   */
//  public static void println(Exception ex) {
//    print(ex);
//    println("--------");
//  }
//
//  //////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  /**
//   * print a trace to the logger
//   * 
//   * @param s
//   */
//  public static void print(boolean level, String s) {
//    if (level) {
//      print(s);
//    }
//  }
//
//  /**
//   * print a nested exception in the logger
//   * @param ex the exception to print
//   */
//  public static void print(boolean level, Exception ex) {
//    if (level) {
//      print(ex);
//    }
//  }
//
  
  public static void println(boolean level, String s) {
    if (level) {
      l.log(s);
    }
  }

  public static void println(boolean level, Exception s) {
    if (level) {
      l.log(s);
    }
  }

  public synchronized void log(String s) {
    for (Handler h : handlers)
      h.log(s);
  }
  
  public synchronized void log(Exception e) {
    if(e!=null)
    for (Handler h : handlers){
      log(e.toString());
      log(e.getMessage());
      for(StackTraceElement ste : e.getStackTrace())
        h.log(ste.toString());
      if (e instanceof JadeException){
        log("caused by");
        log(((JadeException)e).getNestedException());
      }
    }
  }

  
  public static synchronized void println(String s) {
    l.log(s);
  }
  
  public static synchronized void println(Exception e) {
    l.log(e);
  }
}
